package br.com.dallasmotopecas.comum.funcionario.controller;

import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;

import javax.faces.context.ExternalContext;

import br.com.dallasmotopecas.comum.funcionario.model.FuncionarioModel;
import br.com.dallasmotopecas.comum.funcionario.vo.FuncionarioVo;
import br.com.dallasmotopecas.eptus.funcionario.controller.FuncionarioEptusController;
import br.com.dallasmotopecas.util.controller.AbstractController;
import br.com.dallasmotopecas.util.exception.AlterarObjetoException;
import br.com.dallasmotopecas.util.exception.ClasseNaoEncontradaException;
import br.com.dallasmotopecas.util.exception.ConexaoException;
import br.com.dallasmotopecas.util.exception.ConsultarObjetoException;
import br.com.dallasmotopecas.util.exception.InserirObjetoException;
import br.com.dallasmotopecas.util.exception.ListarObjetoException;

public class FuncionarioController extends AbstractController
{
	public FuncionarioController(Connection connection) throws ConexaoException
	{
		super(connection);
	}
	
	public FuncionarioController(ExternalContext externalContext) throws ClasseNaoEncontradaException, ConexaoException
	{
		super(externalContext);
	}

	public void gravarFuncionarios() throws AlterarObjetoException, InserirObjetoException, ConexaoException, ListarObjetoException
	{
		FuncionarioEptusController funcionarioEptusController = null;
		FuncionarioModel funcionarioModel = null;
		List<FuncionarioVo> listaFuncionario = null;
		try
		{
			listaFuncionario = new ArrayList<FuncionarioVo>();
			
			funcionarioEptusController = new FuncionarioEptusController(getConnection());
			funcionarioEptusController.listarFuncionario(listaFuncionario);
			
			funcionarioModel = new FuncionarioModel(getConnection());
			
			synchronized (FuncionarioVo.class)
			{
				beginTransaction();
				
				for(int i = 0; i < listaFuncionario.size(); i++)
				{
					if (funcionarioModel.alterarFuncioanrio(listaFuncionario.get(i)) == 0)
						funcionarioModel.inserirFuncioanrio(listaFuncionario.get(i));
				}
				
				commit();
			}
			
		}
		catch(AlterarObjetoException e)
		{
			rollback();
			throw e;
		}
		catch (InserirObjetoException e)
		{
			rollback();
			throw e;
		}
		catch (ConexaoException e)
		{
			throw e;
		}
		catch (ListarObjetoException e)
		{
			throw e;
		}
		finally
		{
			funcionarioEptusController = null;
			funcionarioModel = null;
		}
	}

	public void carregarListaFuncionario(final List<FuncionarioVo> listaFuncionario) throws ListarObjetoException
	{
		FuncionarioModel funcionarioModel = null;
		try
		{
			if (listaFuncionario != null)
			{
				listaFuncionario.clear();
				
				funcionarioModel = new FuncionarioModel(getConnection());
				listaFuncionario.addAll(funcionarioModel.getListaFuncionario());
			}
		}
		catch (ListarObjetoException e)
		{
			throw e;
		}
		finally
		{
			funcionarioModel = null;
		}
	}
	
	public void consultarFuncionario(final FuncionarioVo funcionarioVo) throws ConsultarObjetoException
	{
		FuncionarioModel funcionarioModel = null;
		try
		{
			if (funcionarioVo != null)
			{	
				funcionarioModel = new FuncionarioModel(getConnection());
				funcionarioModel.consultarFuncionario(funcionarioVo);
			}
		}
		catch (ConsultarObjetoException e)
		{
			throw e;
		}
		finally
		{
			funcionarioModel = null;
		}
	}
}
